// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CommonUserWidget.h"
#include "GameplayTagContainer.h"

#include "LyraTaggedWidget.generated.h"

class UObject;

/**
 * 布局中已被标记的控件（可以根据所属玩家身上的标签隐藏或显示）
 */
UCLASS(Abstract, Blueprintable)
class ULyraTaggedWidget : public UCommonUserWidget
{
	GENERATED_BODY()

public:
	ULyraTaggedWidget(const FObjectInitializer& ObjectInitializer); // 构造函数

	//~UWidget 接口
	/**
	 * 设置可见性
	 * @param InVisibility 可见性
	 */
	virtual void SetVisibility(ESlateVisibility InVisibility) override;
	//~UWidget 接口结束

	//~UUserWidget 接口
	/**
	 * 原生构造
	 */
	virtual void NativeConstruct() override;
	/**
	 * 原生析构
	 */
	virtual void NativeDestruct() override;
	//~UUserWidget 接口结束

protected:
	/** 如果所属玩家拥有这些标签中的任何一个，此控件将被隐藏（使用HiddenVisibility） */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "HUD") // 隐藏标签容器
	FGameplayTagContainer HiddenByTags;

	/** 当此控件显示时（未被游戏玩法标签隐藏）使用的可见性。 */
	UPROPERTY(EditAnywhere, Category = "HUD") // 显示时的可见性
	ESlateVisibility ShownVisibility = ESlateVisibility::Visible;

	/** 当此控件被游戏玩法标签隐藏时使用的可见性。 */
	UPROPERTY(EditAnywhere, Category = "HUD") // 隐藏时的可见性
	ESlateVisibility HiddenVisibility = ESlateVisibility::Collapsed;

	/** 我们想要可见吗（忽略标签）？ */
	bool bWantsToBeVisible = true; // 想要可见的标志

private:
	/**
	 * 当观察的标签改变时调用
	 */
	void OnWatchedTagsChanged();
};